#include "themeanimation.h"
#include <QColor>

/**
 * @brief 构造函数
 * @param parent 父窗口对象，默认为nullptr
 */
ThemeAnimation::ThemeAnimation(QWidget* parent)
    : QObject(parent)
    , m_parentWidget(parent)
{
    // 确保父窗口有效
    if (!m_parentWidget) {
        qWarning() << "ThemeAnimation: Parent widget is null";
        return;
    }

    // 初始化淡入淡出动画
    m_fadeAnimation = new QPropertyAnimation(this);
    m_fadeAnimation->setTargetObject(m_parentWidget);
    m_fadeAnimation->setPropertyName("windowOpacity");
    m_fadeAnimation->setDuration(2000);  // 动画持续时间ms

    // 连接动画完成信号到槽函数
    connect(m_fadeAnimation, &QPropertyAnimation::finished,
            this, &ThemeAnimation::onAnimationFinished);
}

/**
 * @brief 开始淡出动画
 * @param startOpacity 起始透明度 1.0
 * @param endOpacity 结束透明度 0.0
 */
void ThemeAnimation::fadeOut(qreal startOpacity, qreal endOpacity) {
    // 确保父窗口有效且已显示
    if (!m_parentWidget) {
        qWarning() << "ThemeAnimation: Parent widget is null";
        return;
    }

    if (!m_parentWidget->isVisible()) {
        m_parentWidget->show();
    }

    // 如果动画正在运行，先停止它
    if (m_fadeAnimation->state() == QAbstractAnimation::Running) {
        m_fadeAnimation->stop();
        disconnect(m_fadeAnimation, &QPropertyAnimation::finished,
                   this, &ThemeAnimation::onAnimationFinished);
    }

    // 设置淡出动画参数
    m_fadeAnimation->setStartValue(startOpacity);
    m_fadeAnimation->setEndValue(endOpacity);

    // 连接淡出完成信号
    connect(m_fadeAnimation, &QPropertyAnimation::finished,
            this, [this]() {
        m_fadeAnimation->stop();
    });

    // 开始淡出动画
    m_fadeAnimation->start();
}

/**
 * @brief 开始淡入动画
 * @param startOpacity 起始透明度 0.0
 * @param endOpacity 结束透明度 1.0
 */
void ThemeAnimation::fadeIn(qreal startOpacity, qreal endOpacity) {
    // 确保父窗口有效且已显示
    if (!m_parentWidget) {
        qWarning() << "ThemeAnimation: Parent widget is null";
        return;
    }

    // 如果动画正在运行，先停止它
    if (m_fadeAnimation->state() == QAbstractAnimation::Running) {
        m_fadeAnimation->stop();
        disconnect(m_fadeAnimation, &QPropertyAnimation::finished,
                   this, &ThemeAnimation::onAnimationFinished);
    }

    // 设置淡入动画参数
    m_fadeAnimation->setStartValue(startOpacity);
    m_fadeAnimation->setEndValue(endOpacity);

    // 连接淡入完成信号
    connect(m_fadeAnimation, &QPropertyAnimation::finished,
            this, [this]() {
        m_fadeAnimation->stop();
    });

    // 开始淡入动画
    m_fadeAnimation->start();
}

/**
 * @brief 执行完整主题切换动画
 * @param newTheme 目标主题名称
 */
void ThemeAnimation::fadeToTheme(ThemeManager::ThemeQssEnum theme) {
    // 保存待切换的主题
    m_pendingTheme = ThemeManager::themeToString(theme);

    // 切换到新主题
    if (!m_pendingTheme.isEmpty()) {
        ThemeManager::instance().setTheme(m_pendingTheme);
        m_pendingTheme.clear();
    }
}

/**
 * @brief 执行完整主题切换动画
 * @param newTheme 目标主题名称
 */
void ThemeAnimation::fadeToTheme(const QString &theme) {
    // 保存待切换的主题
    m_pendingTheme = theme;

    // 切换到新主题
    if (!m_pendingTheme.isEmpty()) {
        ThemeManager::instance().setTheme(m_pendingTheme);
        m_pendingTheme.clear();
    }
}

/**
 * @brief 动画完成槽函数
 *
 * 当主题切换动画完成时调用，用于清理资源或执行后续操作。
 * 在这里停止动画并断开信号连接，避免重复触发。
 */
void ThemeAnimation::onAnimationFinished() {
    // 停止动画
    if (m_fadeAnimation->state() == QAbstractAnimation::Running) {
        m_fadeAnimation->stop();
    }

    // 断开动画完成信号，防止重复触发
    disconnect(m_fadeAnimation, &QPropertyAnimation::finished,
               this, &ThemeAnimation::onAnimationFinished);

    // 发出动画完成信号
    emit animationFinished();
}
